package com.example.game;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Clock extends Service {
    public static Clock instance;
    private static String TAG = Clock.class.getName();
    private static final long LOOP_TIME = 1;
    private static ScheduledExecutorService mExecutorService;

    private static int count = 0;

    // 定时任务。匿名内部类run方法，在一个线程中更新并打印count的值
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            count++;//自增
            SetTime(count);//将自增的参数传递给广播
            Log.d("Clock", "=== count:" + count);
        }
    };

    //服务启动时。
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
        count = 0;
        instance = this;//将当前的实例赋值给类的静态成员变量instance,实现单例模式
        mExecutorService = Executors.newScheduledThreadPool(2);//创建一个固定大小为2的线程池mExecutorService
        mExecutorService.scheduleAtFixedRate(mRunnable, LOOP_TIME, LOOP_TIME, TimeUnit.SECONDS);//使用scheduleAtFixedRate方法定时执行mRunnable任务，每隔LOOP_TIME 1 秒执行一次
    }

    //该函数处理传入的intent，并决定Service的启动行为
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    //当Activity组件通过StartService（）或者binService()方法与service建立连接时调用该函数。
    //对传入的intent进行处理，决定Service的启动行为。 函数返回一个IBinder对象，用于在客户端和服务之间进行通信。如果返回null，则表示Service不提供绑定。
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.d(TAG, "onBind");
        return null;
    }

    //当Activiy被销毁时调用该方法
    //释放资源，防止内存泄露
    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
        mExecutorService.shutdown();//关闭线程池
        mExecutorService = null;//置空
        mRunnable = null;//置空
    }

    private void SetTime(int time) {
        Intent intent = new Intent("ACTION_UPDATE_TIME");//创建一个Intent对象，设置其动作为ACTION_UPDATE_TIME
        intent.putExtra("time", time);//putExtra将time作为额外参数添加到intent中
        //获取到本地广播管理者对象，发送广播Intent，从而触发接收广播的组件进行相应操作，更新时间
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }

}